package com.cgc.venus.server.app.inter;

import com.cgc.venus.server.app.bean.*;
import com.cgc.venus.server.core.exception.VenusException;
import com.cgc.venus.server.core.harbor.model.Project;
import com.cgc.venus.server.core.harbor.model.Repository;
import com.cgc.venus.server.core.harbor.model.Tag;
import io.fabric8.kubernetes.api.model.*;
import io.fabric8.kubernetes.api.model.extensions.Ingress;

import java.util.List;
import java.util.Map;

/**
 * Created by 业哥 on 2017/11/15.
 * 应用管理-接口
 */
public interface AppManageService {

    /*
    * 1: 根据上传的yaml文件,创建应用
    * @param AppManageBean 应用实体类
    * @param yamlContent yaml文件的内容
    * */
    String createAppByYaml(AppManageBean appManageBean, String yamlContent) throws VenusException;

    /*
    * 2: 根据上传的yaml,创建应用,并保存一条记录到数据里面
    * @param AppManageBean 应用实体类
    * */
    int createAppByYaml(AppManageBean appManageBean) throws VenusException;

    /*
    * 根据空间名字,应用名称(k8s里面的),应用资源类型,判断是否存在重复数据
    * @param namespace
    * @param appNameKube
    * @param appKind 应用资源类型
    * */
    boolean existApp(String namespace, String appNameKube, String appKind) throws VenusException;

    /*
    * 查询应用
    * @param page
    * @param pageSize
    * @param queryKey
    * @param queryStatus
    * @param namespace
    * */
    List<AppManageBean> queryApps(int page, int pageSize, String queryKey, String queryStatus, String namespace) throws VenusException;


    long countApps(String queryKey, String namespace) throws VenusException;

    /*
    * 获得deployment应用信息,根据空间名称,应用名称,应用类型,
    * @param namespace 空间名称
    * @param appNameKube 应用名称
    * */
    String getDeploymentReplicas(String namespace, String appNameKube) throws VenusException;

    /*
    * 获得StatefulSet,应用实例数目,根据空间名称,应用名称
    * @param namespace 空间名称
    * @param appNameKube 应用名称
    * */
    String getStatefulSetReplicas(String namespace, String appNameKube) throws VenusException;

    /*
    * 获得DaemonSet,应用实例数目,根据空间名称,应用名称
    * */

    /*
    * 根据应用ID,获取应用信息
    * @param appId 应用ID
    * */
    AppManageBean getAppManageBeanById(String appId) throws VenusException;

    /*
    * 根据应用类型,获得应用实例数
    * @param appKind 应用类型
    * @param namespace 空间名称
    * @param appNameKube 应用名称
    * */
    String getReplicasByKind(String appKind, String namespace, String appNameKube) throws VenusException;



    /*
    * 根据实例数.分析,得出应用状态
    * @param replicas 副本数
    * @param createTime 应用创建时间
    * */
    String getAppStatus(String replicas, String createTime) throws VenusException;

    /*
    * 得到pod 状态
    * @param namespace 空间名称
    * @param appNameKube 应用名
    * */
    List<AppManageBean> getPodStatus(String namespace, String appNameKube) throws VenusException;

    /*
    * 根据空间名称,实例名称,实例类型,更新数据库
    * */
    int updateAppLastTime(String appId) throws VenusException;

    /*
    * 灰度升级,更新数据应用的镜像版本号
    * */
    int updateAppImageVersion(String imageVersion, String appId) throws VenusException;

    /*
    * 判断当前应用是否启用了自动伸缩功能
    * */
    boolean autoScale(String namespace, String hpaName) throws VenusException;

    /*
    * 22: 水平伸缩deployment 实例数量
    * @param namespace 应用所属空间名称
    * @param appNameKube 应用名称
    * @param replicas 期望实例数量
    * */
    int horizontalScalingDeployment(String namespace, String appNameKube, int replicas) throws VenusException;

    /*
    * 23: 水平伸缩 StatefulSet 实例数量
    * @param namespace 应用所属空间名称
    * @param appNameKube 应用名称
    * @param replicas 期望实例数量
    * */
    int horizontalScalingStatefulSet(String namespace, String appNameKube, int replicas) throws VenusException;

    /*
    * 重新部署应用
    * */
    int reDeployApp(String appKind, String namespace, String appNameKube, int targetReplicas) throws VenusException;

    /*
    * 24: 灰度升级,deployment
    * */
    boolean updateDeployment(String namespace, String appNameKube, String targetImage) throws VenusException;

    /*
    * 25: 灰度升级,statefulset
    * */
    boolean updateStatefunSet(String namespace, String appNameKube, String targetImage) throws VenusException;

    /*
    * 26: 灰度升级,DaemonSet
    * */
    boolean updateDaemonSet(String namespace, String appNameKube, String targetImage) throws VenusException;

    /*
    * 灰度升级,获取当前应用,所使用的镜像名称,以及版本列表
    * */
    List<Tag> getRepositorieTags(String imageName) throws VenusException;

    /*
    * 获取自动应用自动伸缩设置的参数
    * */
    AppManageHpaBean getAppHpa(String namespace, String appNameKube) throws VenusException;


    /*
    * 应用,新增自动伸缩功能
    * */
    boolean addAutoScaleToApp(AppManageHpaBean appManageHpaBean) throws VenusException;

    /*
    * 修改,应用自动伸缩参数
    * */
    boolean editAutoScaleToApp(AppManageHpaBean appManageHpaBean) throws VenusException;

    /*
    * 删除,应用自动伸缩功能
    * */
    boolean deleteAutoScaleToApp(String namespace, String appNameKube) throws VenusException;

    /*
    * 删除应用,k8s
    * */
    boolean deleteAppInK8s(String appKind, String namespace, String appNameKube) throws VenusException;

    /*
    * 删除pod
    * */
    boolean deletePod(String namespace, String podName) throws VenusException;

    /*
    * 删除应用,数据库记录
    * */
    int deleteApp(String appId) throws VenusException;


    /*
    * 修改应用描述
    * */
    int editAppDescribed(String appId, String described) throws VenusException;


    /*
    * 获取pod 事件
    * @param namespace pod 空间名称
    * @param podName pod名称
    * */
    List<AppManageEventBean> getPodEvents(String namespace, String podName) throws VenusException;


    /*
    * 根据空间名称,应用名,得到pod 名称呼列表
    * */
    List<String> getPodNames(String namespace, String appNameKube) throws VenusException;


    /*
    * 根据标签获取pod list
    * */
    List<AppManageBean> getPodListWithLabel(String namespace, String appNameKube) throws VenusException;

    /*
    * 获取所有应用
    * */
    List<AppManageBean> getAllApp() throws VenusException;

    /*
    * 验证应用名称是否存在
    * */
    int validateAppName(String appName) throws VenusException;

    /*
    * 通过镜像仓库部署应用时候,根据项目名称获取镜像列表,选择部署的镜像
    * */
    List<Repository> getProjectImages(String projectName) throws VenusException;

    /*
    * 获得镜像数据库的公开镜像
    * */
    List<Repository> getPublicImages() throws VenusException;

    /*
    * 获得商店的镜像
    * */
    List<Repository> getSoreImages() throws VenusException;

    /*
    * 获取镜像基本信息,根据镜像名称
    * */
    ImageBaseBean getImageBase(String imageName) throws VenusException;

    /*
    * 获取镜像端口列表,根据镜像名称
    * */
    List<Map<String, Object>> getImagePortList(String imageName) throws VenusException;

    /*
    * 获取镜像的环境变量列表,根据镜像名称
    * */
    List<Map<String, Object>> getImageEnvList(String imageName) throws VenusException;

    /*
    * 获取镜像配置卷,根据镜像名称
    * */
    List<Map<String, Object>> getImageConfigVolumes(String imageName) throws VenusException;

    /*
    * 获取镜像高可用信息
    * */
    ImageHighAvailabilityBean getImageHABean(String imageName) throws VenusException;

    /*
    * 得到镜像启动参数
    * */
    List<Map<String, Object>> getImageArgsList(String imageName) throws VenusException;

    /*
    * 新增镜像基本信息
    * */
    int addImageBase(ImageBaseBean imageBaseBean) throws VenusException;

    /*
    * 修改镜像基本信息
    * */
    int editImageBse(ImageBaseBean imageBaseBean) throws VenusException;

    //////////////////////////////////////////////////////处理端口////////////////////////////////////////////////////////


    /*
    * 新增镜像-端口-信息
    * */
    int batchAddImagePort(List<ImagePortBean> imagePortBeanList, String imageName) throws VenusException;

    /*
    * 修改镜像-端口-信息
    * */
    int batchEditImagePort(List<ImagePortBean> imagePortBeanList) throws VenusException;

    /*
    * 获取镜像-端口-信息
    * */
    ImagePortBean getImagePortBean(String imageName, int port);

    /*
    * 删除镜像-端口-信息
    * */
    int deleteImagePort(String id) throws VenusException;


    /*
    * 处理镜像端口信息: 新增,修改
    * */
    int handleImagePort(List<ImagePortBean> imagePortBeanList, String imageName) throws VenusException;

    //////////////////////////////////////////////////////处理镜像,启动参数////////////////////////////////////////////////////


    /*
    * 新增,镜像启动参数
    * */
    int batchAddImageCommandArg(List<ImageArgsBean> argsBeanList, String imageName) throws VenusException;


    /*
    * 修改镜像启动参数
    * */
    int batchEditImageCommandArg(List<ImageArgsBean> argsBeanList);


    /*
    * 删除镜像启动,参数
    * */
    int deleteImageArg(String id) throws VenusException;

    /*
    * 处理镜像参数
    * */
    int handleImageArgs(List<ImageArgsBean> argsBeanList, String imageName) throws VenusException;


    //////////////////////////////////////////////////////处理环境变量////////////////////////////////////////////////////////

    /*
    * 新增镜像-环境变量-信息
    * */
    int batchAddImageEnv(List<ImageEnvBean> envBeanList, String imageName) throws VenusException;

    /*
    * 修改镜像-环境变量-信息
    * */
    int batchEditImageEnv(List<ImageEnvBean> envBeanList) throws VenusException;

    /*
    * 获取环境变量信息
    * */
    ImageEnvBean getImageEnv(String image, String envKey);

    /*
    * 删除镜像-环境变量-信息
    * */
    int deleteImageEnv(String id) throws VenusException;

    /*
    * 处理镜像-环境变量信息
    * */
    int handleImageEnv(List<ImageEnvBean> envBeanList, String imageName) throws VenusException;


    ///////////////////////////////////////////////////镜像配置文件卷-信息/////////////////////////////////////////////////////


    /*
    * 新增镜像-配置管理文件卷-信息
    * */
    int batchAddImageConfigVolumes(List<ImageConfigVolumesBean> configVolumesBeanList, String imageName) throws VenusException;

    /*
    * 修改镜像-配置管理文件卷-信息,根据ID修改
    * */
    int batchEditImageConfigVolumes(List<ImageConfigVolumesBean> configVolumesBeanList) throws VenusException;


    /*
    * 处理镜像,配置管理文件卷-信息
    * */
    int handleImageConfigVolumes(List<ImageConfigVolumesBean> configVolumesBeanList, String imageName) throws VenusException;


    /////////////////////////////////////////////////镜像-高可用-信息////////////////////////////////////////////////////////////

    /*
    * 新增镜像-高可用信息
    * */
    int addImageHA(ImageHighAvailabilityBean imageHighAvailabilityBean, String imageName) throws VenusException;

    /*
    * 修改镜像-高可用信息
    * */
    int editImageHA(ImageHighAvailabilityBean imageHighAvailabilityBean) throws VenusException;

    /*
    * 删除镜像,参数信息,根据镜像的ID,参数类型: port,env
    * */
    int deleteImageParam(String id, String paramType) throws VenusException;


    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /*
    * 校验k8s里面的应用名称是否重复
    * */
    int validateAppNameKube(String appNameKube) throws VenusException;


    /////////////////////////////////////////////////根据选择的镜像部署应用////////////////////////////////////////////////////

    /*
    * 得到一对label标签
    * */
    Map<String, String> getLabelMap(String labelKey, String labelValue) throws VenusException;

    /*
    * 40: 得到请求内存,最小,最大,资源-map
    * */
    Map<String, Quantity> getMemoryResourcesMap(String value) throws VenusException;

    /*
    * 得到容器端口列表
    * */
    List<ContainerPort> getContainerPortList(List<ImagePortBean> portList) throws VenusException;

    /*
    * 得到环境变量列表
    * */
    List<EnvVar> getEnvVarList(List<ImageEnvBean> envBeanList) throws VenusException;

    /*
    * 得到 VolumeMount
    * */
    VolumeMount getVolumeMount(String name, String mouthPath) throws VenusException;

    /*
    * 得到容器-配置文件挂载卷列表
    * */
    List<VolumeMount> getConfigVolumeMountList(List<ImageConfigVolumesBean> volumesBeanList, List<VolumeMount> volumeMountList) throws VenusException;

    /*
    * 得到,StatefulSet,有状态,持久化挂载卷列表
    * */
    List<VolumeMount> getStatefulSetVolumeMountList(List<ImageStatefulSetPVCBean> statefulSetPVCBeanList, List<VolumeMount> volumeMountList) throws VenusException;


    /*
    * 得到,deployment,持久化挂载卷列表
    * */
    List<VolumeMount> getDeploymentVolumeMountList(List<ImageDeploymentPVCBean> deploymentPVCBeanList, List<VolumeMount> volumeMountList) throws VenusException;

    /*
    * 得到容器-配置文件卷列表
    * */
    List<Volume> getConfigVolumeList(List<ImageConfigVolumesBean> volumesBeanList, List<Volume> volumeList) throws VenusException;

    /*
    * 得到,StatefulSet,有状态,持久化卷列表
    * */
    List<PersistentVolumeClaim> getStatefulSetVolumeList(List<ImageStatefulSetPVCBean> statefulSetPVCBeanList, String appNameKube) throws VenusException;

    /*
    * 得到,deployment,持久化卷列表
    * */
    List<Volume> getDeploymentVolumeList(List<ImageDeploymentPVCBean> deploymentPVCBeanList, List<Volume> volumeList) throws VenusException;

    /*
    * 得到,配置文件key-path list
    * */
    List<KeyToPath> getKeyToPathList(String[] configFiles) throws VenusException;

    /*
    * 得到镜像,启动参数
    * */
    List<String> getArgsList(List<ImageArgsBean> argsBeanList) throws VenusException;

    /*
    * 高可用: http
    * */
    Probe getHttpProbe(ImageHighAvailabilityBean highAvailabilityBean) throws VenusException;

    /*
    * 高可用: tcp
    * */
    Probe getTcpProbe(ImageHighAvailabilityBean highAvailabilityBean) throws VenusException;

    /*
    * 根据空间名称,得到该空间所属的物理分组
    * */
    String getPhysicalGroup(String namespace) throws VenusException;

    /*
    * 部署,无状态的应用,deployment
    * */
    boolean deploymentApp(ImageDataBean imageDataBean) throws VenusException;

    /*
    * 新增记录到数据库
    * */
    int addDeployApp(ImageBaseBean imageBaseBean, String namespace) throws VenusException;

    boolean handelService(List<ImagePortBean> portBeanList, String appNameKube, String namespace) throws VenusException;

    /*
    * 创建service
    * */
    boolean createService(List<ImagePortBean> portBeanList, String appNameKube, String namespace) throws VenusException;

    /*
    * 创建service2 lcy 2018/4/2
    * */
    boolean createService2(ServiceBean serviceBean) throws VenusException;

    /*
    * 删除,service
    * */
    boolean deleteService(String appNameKube, String namespace) throws VenusException;

    /*
    * 根据服务名称删除服务
    * */
    boolean deleteServiceByName(String namespace,String serviceName) throws VenusException;

    /*
    * 部署,有状态的应用,statefulset
    * */
    boolean statefulSetApp(ImageDataBean imageDataBean) throws VenusException;

    /*
    * 得到应用的服务地址
    * */
    List<Map<String, Object>> getServiceAddress(String namespace, String serviceName) throws VenusException;

    /*
    * 删除,ingress
    * */
    boolean deleteIngress(String namespace, String appNameKube) throws VenusException;

    /*
    * 删除ingress
    * */
    boolean deleteIngressByName(String ingressName,String namespace) throws VenusException;

    /*
    * 删除hpa ,根据标签
    * */
    boolean deleteHPAByLabels(String namespace, String appNameKube) throws VenusException;

    /*
    * 得到服务列表,根据标签
    * */
    List<Map<String, Object>> getServiceAddressByLabels(String namespace, String appNameKube) throws VenusException;

    /*
    * http服务,新增域名
    * */
    int addDomainName(String namespace, String appNameKube, String serviceName,String ingressName, String domainName, int port) throws VenusException;

    /*
    * http服务,获得域名服务
    * */
    String getDomainName(String namespace, String appNameKube, String serviceName, int port) throws VenusException;

    /*
    * http服务,获得域名信息
    * */
    Map<String,Object> getDomainNameBean(String namespace, String appNameKube, String serviceName, int port) throws VenusException;

    /*
    * 获得服务域名
    * */
    Map<String,Object> getDomainName(String namespace,String serviceName) throws VenusException;


    /*
    * http服务,删除域名
    * */
    int deleteDomainName(String namespace, String appNameKube) throws VenusException;

    /*
    * http服务,删除域名
    * */
    int deleteDomainNameById(String id) throws VenusException;

    /*
    * 校验域名是否存在
    * */
    boolean validateDomainName(String domainName) throws VenusException;

    /*
    * 获得应用的服务配置
    * */
    List<Map<String, Object>> getDeploymentConfigMap(String namespace, String appNameKube) throws VenusException;

    /*
    * 修改服务配置
    * */
    boolean editDeploymentConfigMapToApp(AppConfigMapManageBean appConfigMapManageBean) throws VenusException;


    /*
    * 新增服务配置
    * */
    boolean addDeploymentConfigMapToApp(AppConfigMapManageBean appConfigMapManageBean) throws VenusException;

    /*
    * 删除服务配置
    * */
    boolean deleteDeploymentConfigMapToApp(AppConfigMapManageBean appConfigMapManageBean) throws VenusException;


    /*
    * 获取自动伸缩的数据
    * */
    List<Map<String, Object>> getHPAData(String hpaName, String namespace) throws VenusException;


    /*
    * 展示应用服务配置
    * */
    List<ImagePortBean> getAppService(String namespace,String appNameKube) throws VenusException;

    /*
    * 展示应用服务信息
    * */
    List<ServiceBean> getAppServiceByNamespace(String namespace) throws VenusException;

    /*
    * 获得deployment应用的端口
    * */
    List<Integer> getDeploymentPorts(String namespace,String appNameKube) throws VenusException;

    /*
    * 获得statefulSet 应用端口
    * */
    List<Integer> getStatefulSetPorts(String namespace,String appNameKube) throws VenusException;

    /*
    * 检验服务名称是否存在
    * */
    boolean validateServiceName(String serviceName,String namespace) throws VenusException;

   /*
   * 修改应用服务的服务端口,nodePort,k8s集群节点物理主机
   * */
   boolean editAppServiceNodePort(ImagePortBean imagePortBean) throws VenusException;

   /*
   * 修改应用服务的服务域名
   * */
   boolean editAppServiceDomainName(ImagePortBean imagePortBean) throws VenusException;

    /*
    * 得到tcp服务端口列表,根据空间名称
    * */
    List<Integer> getServicePortList() throws VenusException;

    /*
    * 展示ingress信息
    * */
    List<IngressBean> getIngressByNamespace(String namespace) throws VenusException;

    /**
     * 新增或者修改ingress
     * @param ingressBean
     * @return
     * @throws VenusException
     */
    boolean saveOrUpdateIngress(IngressBean ingressBean) throws VenusException;

    /**
     * 根据空间和ingress名称获取ingress对象
     * @param namespace
     * @param ingressName
     * @return
     * @throws VenusException
     */
    Ingress getIngress(String namespace,String ingressName)throws VenusException;

    /*
    * add by 业哥 180511
    * 根据应用类型,获得应用实例数
    * @param appKind 应用类型
    * @param namespace 空间名称
    * @param appNameKube 应用名称
    * @param appManageBean 应用管理bean
    * */
    void getAppBaseInfo(String appKind, String namespace, String appNameKube,AppManageBean appManageBean) throws VenusException;

    /*
    * add by 业哥 180515
    * 根据应用类型,设置应用相关信息(含资源,启动参数,环境变量)
    * */
    boolean setAppBaseInfo(AppBaseInfoBean appBaseInfoBean) throws VenusException;

}
